<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>创建对象</title>
</head>

<body>
  <script>
    // 1.字面量对象
    let obj1 = {};
    // 动态添加属性
    // obj1.name = "肖申克"
    // obj1.age = 33;
    // obj1.eat=function(){
    //   console.log("肖恩克的救赎");
    // }

    // obj1.eat()

    // 2. new Object();
    let obj2 = new Object({ a: 1, b: 2 });
    console.log(obj2); //{a: 1, b: 2}


    let s = new Object("a b c d e f")
    console.log(s); //String {'a b c d e f'}
    let x = s.substr(1, 5)
    console.log(x); // " b c"

    let gf = new Object(true)
    console.log(gf);

    // 3. 构造函数：必须要符合三个特点，
    // 1. 函数的首字母必须要大写。
    // 2. 通过this来绑定属性和方法
    // 3. 只能通过new运算符来创建实例化的对象。
    function Plane(name, sex) {
      this.name = name
      this.sex = sex;
      this.isDie = false;
      this.move = function () {
        console.log('这个飞机可以飞，可以发子弹');
      }
    }

    let p = new Plane('杜盟卓号', '男')
    console.log(p);  //Plane {name: '杜盟卓号', sex: '男', isDie: false, move: ƒ}
    p.move()//这个飞机可以飞，可以发子弹


    // 4. class，es6类语法；es5之前，只有构造函数。
    // 类的首字母，必须要大写。
    class Student {
      // constructor,构造器
      constructor(name,age,sex,score) {
        // 对象的属性
        this.name = name;
        this.age = age;
        this.sex = sex;
        this.score = score;
      }
      // 类里面的方法：方法再实例化对象的原型对象（Prototype）里面
      eat(text){
        console.log(this.name + '在吃'+text);
      }
      read(text){
        console.log(this.name + '在读'+text);
      }
    }

    // 创建一个学生的实例化对象
    let zrp = new Student('张荣平',22,'男',0);  
    console.log(zrp); //Student {name: '张荣平', age: 22, sex: '男', score: 0}

    // 方法再实例化对象的原型对象（Prototype）里面，输出对象时，不能直接看见方法名的。
    zrp.eat('苞谷')
    zrp.read('三字经')
  </script>
</body>

</html>